1. Pandas란?
2. 왜 Pandas를 사용해야 하는가?
(1) 강력한 데이터 구조
(2) 다양한 데이터 소스 지원
(3) 직관적인 데이터 선택과 필터링
(4) 결측값(Missing Data) 처리
(5) 데이터 정렬과 정리
(6) 그룹화와 집계 (GroupBy)
(7) 데이터 병합과 결합
(8) 빠른 데이터 탐색
(9) 시계열 데이터 처리
(10) 피벗 테이블
3. NumPy vs Pandas: 언제 무엇을 사용할까?
4. Pandas 사용 예제: 실전 시나리오
5. Pandas 성능 최적화 팁
6. 결론
Pandas는 Python에서 데이터 분석과 조작을 위한 가장 강력하고 널리 사용되는 라이브러리입니다. 2008년 Wes McKinney가 금융 데이터 분석을 위해 개발했으며, 현재는 데이터 과학 분야의 필수 도구로 자리잡았습니다.
주요 특징:
(1) 강력한 데이터 구조
(2) 다양한 데이터 소스 지원
(3) 직관적인 데이터 선택과 필터링
(4) 결측값(Missing Data) 처리
(5) 데이터 정렬과 정리
(6) 그룹화와 집계 (GroupBy)
(7) 데이터 병합과 결합
(8) 빠른 데이터 탐색
(9) 시계열 데이터 처리
(10) 피벗 테이블
DataFrame: 2차원 테이블 형태의 데이터 구조
import pandas as pd
# 딕셔너리로 DataFrame 생성
data = {
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 30, 35],
'직업': ['학생', '개발자', '교사']
}
df = pd.DataFrame(data)
print(df)
# 이름 나이 직업
# 0 김철수 25 학생
# 1 이영희 30 개발자
# 2 박민수 35 교사
Series: 1차원 배열 형태의 데이터 구조
ages = pd.Series([25, 30, 35], name='나이')
print(ages)
# 0 25
# 1 30
# 2 35
# Name: 나이, dtype: int64
Pandas는 여러 형식의 데이터를 쉽게 읽고 쓸 수 있습니다.
# CSV 파일
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
# Excel 파일
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('output.xlsx', index=False)
# JSON 파일
df = pd.read_json('data.json')
df.to_json('output.json')
# SQL 데이터베이스
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql('SELECT * FROM table', conn)
# 클립보드에서 직접 복사
df = pd.read_clipboard() # Excel에서 복사한 데이터 바로 읽기
① 열(Column) 선택:
# 단일 열 선택
df['이름']
# 여러 열 선택
df[['이름', '나이']]
② 행(Row) 선택:
# 인덱스로 선택 (iloc)
df.iloc[0] # 첫 번째 행
df.iloc[0:2] # 첫 번째부터 두 번째 행
# 라벨로 선택 (loc)
df.loc[0] # 인덱스 0인 행
df.loc[0:2] # 인덱스 0부터 2까지
③ 조건부 필터링:
# 나이가 30 이상인 사람
df[df['나이'] >= 30]
# 여러 조건 결합
df[(df['나이'] >= 25) & (df['직업'] == '개발자')]
# isin() 메서드 사용
df[df['이름'].isin(['김철수', '이영희'])]
실제 데이터에는 항상 누락된 값이 존재합니다. Pandas는 이를 효과적으로 처리할 수 있습니다.
import numpy as np
# 결측값이 있는 데이터
data = {
'이름': ['김철수', '이영희', None, '박민수'],
'나이': [25, np.nan, 35, 40],
'점수': [85, 90, np.nan, 95]
}
df = pd.DataFrame(data)
# 결측값 확인
df.isnull() # True/False 반환
df.isnull().sum() # 각 열의 결측값 개수
# 결측값 제거
df.dropna() # 결측값이 있는 모든 행 제거
df.dropna(axis=1) # 결측값이 있는 모든 열 제거
df.dropna(subset=['나이']) # 특정 열의 결측값만 제거
# 결측값 채우기
df.fillna(0) # 0으로 채우기
df.fillna(df.mean()) # 평균값으로 채우기
df['나이'].fillna(df['나이'].median()) # 중앙값으로 채우기
# 값으로 정렬
df.sort_values('나이') # 오름차순
df.sort_values('나이', ascending=False) # 내림차순
df.sort_values(['직업', '나이']) # 여러 열 기준 정렬
# 인덱스로 정렬
df.sort_index()
# 중복 제거
df.drop_duplicates()
df.drop_duplicates(subset=['이름']) # 특정 열 기준
# 열 이름 변경
df.rename(columns={'나이': 'age', '이름': 'name'})
데이터를 그룹으로 나누고 통계를 계산하는 강력한 기능입니다.
data = {
'부서': ['영업', '개발', '영업', '개발', '영업'],
'이름': ['김철수', '이영희', '박민수', '최지영', '정우성'],
'급여': [3000, 4000, 3500, 4500, 3200]
}
df = pd.DataFrame(data)
# 부서별 평균 급여
df.groupby('부서')['급여'].mean()
# 여러 집계 함수 적용
df.groupby('부서')['급여'].agg(['mean', 'sum', 'count'])
# 부서 mean sum count
# 개발 4250 8500 2
# 영업 3233 9700 3
# 여러 열에 대해 다른 집계 함수
df.groupby('부서').agg({
'급여': ['mean', 'sum'],
'이름': 'count'
})
① concat: 데이터 이어붙이기
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 세로로 이어붙이기
pd.concat([df1, df2], ignore_index=True)
# 가로로 이어붙이기
pd.concat([df1, df2], axis=1)
② merge: SQL처럼 데이터 결합
employees = pd.DataFrame({
'사번': [1, 2, 3],
'이름': ['김철수', '이영희', '박민수']
})
salaries = pd.DataFrame({
'사번': [1, 2, 4],
'급여': [3000, 4000, 3500]
})
# Inner Join (교집합)
pd.merge(employees, salaries, on='사번', how='inner')
# Left Join
pd.merge(employees, salaries, on='사번', how='left')
# Outer Join (합집합)
pd.merge(employees, salaries, on='사번', how='outer')
대용량 데이터를 빠르게 파악할 수 있는 유용한 메서드들이 있습니다.
# 처음 5행 보기
df.head()
# 마지막 5행 보기
df.tail()
# 데이터 정보 확인
df.info()
# 통계 요약
df.describe()
# 각 열의 고유값 개수
df.nunique()
# 특정 열의 값 개수
df['직업'].value_counts()
# 데이터 형태 확인
df.shape # (행 개수, 열 개수)
Pandas는 날짜와 시간 데이터를 처리하는 강력한 기능을 제공합니다.
# 날짜 문자열을 datetime으로 변환
df['날짜'] = pd.to_datetime(df['날짜'])
# 날짜를 인덱스로 설정
df.set_index('날짜', inplace=True)
# 특정 기간 선택
df['2024-01':'2024-03']
# 리샘플링 (일별 → 월별)
df.resample('M').mean()
# 이동 평균
df['매출'].rolling(window=7).mean() # 7일 이동평균
# 날짜 정보 추출
df['년도'] = df.index.year
df['월'] = df.index.month
df['요일'] = df.index.dayofweek
Excel의 피벗 테이블과 같은 기능을 제공합니다.
data = {
'날짜': ['2024-01', '2024-01', '2024-02', '2024-02'],
'제품': ['A', 'B', 'A', 'B'],
'매출': [100, 150, 120, 180]
}
df = pd.DataFrame(data)
# 피벗 테이블 생성
pivot = df.pivot_table(
values='매출',
index='날짜',
columns='제품',
aggfunc='sum'
)
# 제품 A B
# 날짜
# 2024-01 100 150
# 2024-02 120 180
import pandas as pd
# 데이터 생성
students = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', '최지영', '정우성'],
'학년': [1, 2, 1, 3, 2],
'수학': [85, 92, 78, 95, 88],
'영어': [90, 88, 85, 92, 91],
'과학': [88, 95, 80, 90, 87]
})
# 평균 점수 계산
students['평균'] = students[['수학', '영어', '과학']].mean(axis=1)
# 학년별 평균 점수
students.groupby('학년')['평균'].mean()
# 90점 이상 학생
high_achievers = students[students['평균'] >= 90]
# 각 과목별 최고 점수 학생
for subject in ['수학', '영어', '과학']:
top_student = students.loc[students[subject].idxmax()]
print(f"{subject} 최고점: {top_student['이름']} ({top_student[subject]}점)")
# CSV 파일 읽기
sales = pd.read_csv('sales_data.csv')
# 날짜 변환
sales['날짜'] = pd.to_datetime(sales['날짜'])
# 월별 총 매출
monthly_sales = sales.groupby(sales['날짜'].dt.to_period('M'))['금액'].sum()
# 제품별 판매량
product_sales = sales.groupby('제품명')['수량'].sum().sort_values(ascending=False)
# 상위 10개 제품
top_products = product_sales.head(10)
# 결과 저장
top_products.to_csv('top_10_products.csv')
df['열명'] = df['열명'].astype('category')pd.read_csv('file.csv', chunksize=10000)pd.read_csv('file.csv', usecols=['col1', 'col2'])Pandas는 Python 데이터 분석의 핵심 도구입니다. 다음과 같은 이유로 반드시 학습해야 합니다:
처음에는 어렵게 느껴질 수 있지만, Pandas의 기본 개념과 주요 메서드만 익히면 강력한 데이터 분석 도구를 손에 쥐게 됩니다.